package algorithms.encryption.md5;


import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;

/**
 * MD5加密:不可逆加密算法(只能加密不能解密)
 * 优点：不可逆、易计算、特征化
 * 缺点：可能存在散列冲突
 */
public class MD5Utils {

    /**
     * 加密
     *
     * @param context
     */
    public static String encryptByMd5(String context) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(context.getBytes());//update处理  
            byte[] encryptContext = md.digest();//调用该方法完成计算

            int i;
            StringBuffer buf = new StringBuffer("");
            // 做相应的转化（十六进制）
            for (int offset = 0; offset < encryptContext.length; offset++) {
                i = encryptContext[offset];
                if (i < 0) i += 256;
                if (i < 16) buf.append("0");
                buf.append(Integer.toHexString(i));
            }
            return buf.toString();
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block  
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args) {

        //注册
        String pwd = "1234";
        //盐值
        String salt = UUID.randomUUID().toString();
        //加密加盐
        String md5Pwd = MD5Utils.encryptByMd5(pwd + salt);
        //存数据库 salt  +  md5Pwd
        System.out.println("加密后的密码:" + md5Pwd);

        //模拟登录密码匹配
        String loginPwd = "1234";
        String saltTmp = salt;//从数据库查询来的
        String pwdTmp = MD5Utils.encryptByMd5(pwd + salt);
        System.out.println("加密后的密码:" + pwdTmp);
        System.out.println("比对结果：" + md5Pwd.equals(pwdTmp));


    }


}